package chapter02;

public class IsNumber65 {
    /**
     *模拟
     *模拟 + - E e .出现的合法位置
     *hasE,hasPoint,hasNum 表示(E/e . 数字)是否出现
     *1) + -出现在开头或者是E之后
     *  (c=='+'||c=='-')&&(i==0||chs[i-1]=='e'||chs[i-1]=='E')
     *2) E/e出现的左右两边整体必须有合法数字并且E/e之前没出过
     *  (c=='e'||c=='E')&&!hasE&&hasNum
     *       hasE=true;
     *       hasNum=false;
     *3) .出现在E之前并且.之前没出现过
     *  c=='.'&&!hasPoint&&!hasE
     *      hasPoint=true;
     *  a).左边有数字 合法
     *      i-1>=0&&chs[i-1]>='0'&&chs[i-1]<='9'
     *  b).右边有数字 合法
     *      i+1<chs.length&&chs[i+1]>='0'&&chs[i+1]<='9'
     *  c).左右两边无数字 非法
     *4) 出现的是数字字符 合法
     *   c>='0'&&c<='9'
     *      hasPoint=true;
     *5) 其他情况 非法
     *    return false
     *若循环结束没有返回结果 return hasNum
     *  E没出现但必须有数字
     *  E出现 E之后也必须有数字
     */
    public boolean isNumber(String s) {
        char[] chs=s.toCharArray();
        boolean hasE=false,hasPoint=false,hasNum=false;
        for(int i=0;i<chs.length;i++){
            char c=chs[i];
            if((c=='+'||c=='-')&&(i==0||chs[i-1]=='e'||chs[i-1]=='E')){
                continue;
            }else if((c=='e'||c=='E')&&!hasE&&hasNum){
                hasE=true;
                hasNum=false;
            }else if(c=='.'&&!hasPoint&&!hasE){
                if(i-1>=0&&chs[i-1]>='0'&&chs[i-1]<='9'){
                    hasPoint=true;
                }else if(i+1<chs.length&&chs[i+1]>='0'&&chs[i+1]<='9'){
                    hasPoint=true;
                }else{
                    return false;
                }
            }else if(c>='0'&&c<='9'){
                hasNum=true;
            }else{
                return false;
            }
        }
        return hasNum;
    }
}
